home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / DCLAP 6d / dclap6d / DNet / DNetObject.cpp < prev    next >
Text File  |  1996-07-05  |  11KB  |  532 lines

  1. // DNetObject.cpp
  2. // from DGopher.cp  by d.g. gilbert, Mar 1992 
  3. // version for DClap, Jan 94
  4.  
  5.  
  6. #include <ncbi.h>
  7. #include <dgg.h> 
  8.  
  9. #include "DTCP.h"
  10. #include "DURL.h"
  11. #include "DNetObject.h"
  12.  
  13. #include <DFile.h>
  14. #include <DList.h>
  15. #include <DIconLib.h>
  16. #include <DView.h>
  17. #include <DChildApp.h>
  18.  
  19.  
  20. enum  commonTCPports {
  21.     kUnknownPort = 0,
  22.     kUnsupportedPort = 0,
  23.     kFileport = 21,
  24.     kFTPport = 21,
  25.     kSMTPport = 25,
  26.     kTelnetport = 23,
  27.     kTN3270port = 23,
  28.     kWhoisport= 43,
  29.     kGopherport = 70,
  30.     kFingerport = 79,
  31.     kHTTPport = 80,
  32.     kPOPport    = 110,
  33.     kBOPport    = 7110,
  34.     kNNTPport = 119,
  35.     kWAISport    = 210
  36.     };
  37.  
  38.  
  39. enum NetTypes {
  40.  kTypeFile         = '0',      // text file  
  41.  kTypeFolder        = '1',      // menu/directory 
  42.  kTypeCSO          = '2',        // CSO phone book service 
  43.  kTypeError        = '3',      // error 
  44.  kTypeBinhex        = '4',        // binhex encoded Macintosh file 
  45.  kTypeUuencode     = '6',      // uuencoded file 
  46.  kTypeQuery        = '7',      // question service 
  47.  kTypeTelnet       = '8',      // telnet service 
  48.  kTypeBinary       = '9',      // binary 
  49.  kTypeSound        = 's',      // sound 
  50.  kTypeImage            = 'I',        // image, probably gif
  51.  kTypeMovie            = ',',        // movie
  52.  kTypeNote            = 'i',        // note, information for directory
  53.  kTypeEndOfData    = '.',      // end of information 
  54.  kTypeGif                = 'g',    // GIF picture
  55.  kTypeWhois       = 'w',    // WHOIS phone book service -- not official, just easy 
  56.  kTypeTn3270      = 'T',     // Telnet variant -- just call diff app ?
  57.  kTypeHtml      = 'h',    // WWW type, ????
  58.  kTypeMime        = 'M',  // Mime, no mac reader yet
  59.  kMailType            = 'm',        // mailto, dgg addition for gopherpup
  60.     // obsolete types 
  61.  kTypeBinhexpc    = '5',  // binhex encoded MSDos file 
  62.  kTypeEvent        = 'e',  // ?? 
  63.  kTypeCal                 = 'c',  // ?? 
  64.  kTypeRedundant = '+',  // a redundant server holding the same information as the previous server
  65.  kTypeNull             = '\0'    // end of data
  66. };
  67.  
  68.  
  69.  
  70.  
  71.         //private    variables
  72.  
  73. Local const char*    kLocalhost    = "localhost";
  74. Local const char*    gEmptyString    = "";
  75.  
  76. Local const    long     kReadToClose = DTCP::kTCPStopAtclose;
  77. Local const    long     kReadToDotCRLF = DTCP::kTCPStopAtdotcrlf;
  78.  
  79. Local const    long     kReadMaxbuf1 = 1 * 1024; 
  80. Local const    long     kMaxInt = 32000;
  81.  
  82. Local const char *gMonths[13] = 
  83.     {"Jan","Feb","Mar","Apr","May","Jun",  "Jul","Aug","Sep","Oct","Nov","Dec","???"};
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91. // DNetOb ------------------------------
  92.  
  93.  
  94.  
  95. DNetOb::DNetOb() :
  96.     DTaskMaster( 0, NULL, NULL)
  97. {
  98.     Initialize();
  99. }
  100.  
  101. DNetOb::DNetOb( DNetOb* nob)  :
  102.     DTaskMaster( 0, NULL, NULL) 
  103. {
  104.     Initialize();
  105.     Copy( nob);
  106. }
  107.  
  108.  
  109. DNetOb::~DNetOb()  
  110. {
  111.     MemFree( fName);
  112.     MemFree( fPath);
  113.     MemFree( fHost);
  114.     MemFree( fURL);
  115.     MemFree( fInfo);
  116.     MemFree( fQueryGiven);
  117.     MemFree( fUser);
  118.     MemFree( fPass);
  119. }
  120.  
  121.  
  122. Boolean DNetOb::suicide() 
  123.     if (GetOwnerCount() <= 1) { 
  124.         delete this; 
  125.         return true; 
  126.         }
  127.     else 
  128.         return DObject::suicide();
  129. }
  130.  
  131. Boolean DNetOb::suicide(short ownercount)
  132. {
  133.     if (ownercount < 1) {
  134.         delete this; 
  135.         return true; 
  136.         }
  137.     else 
  138.         return DObject::suicide(ownercount);
  139. }
  140.  
  141. DObject* DNetOb::Clone()
  142. {
  143.     DNetOb* nob= new DNetOb();
  144.     nob->Copy( this);
  145.     return nob;
  146. }
  147.  
  148.  
  149.  
  150. void DNetOb::Initialize()
  151. {
  152.     fName= NULL;
  153.     fPath= NULL;
  154.     fHost= NULL;
  155.     fURL= NULL;
  156.     fUser= NULL;
  157.     fPass= NULL;
  158.     
  159.     fType    = kTypeError; // == ancestor doesn't know much...
  160.     fProtocol = kGopherprot;
  161.     fPort= StandardPort( fProtocol);
  162.     fIsLocal= false;
  163.     fInfo= NULL;
  164.     fInfoSize= 0;
  165.     
  166.     fQuery= NULL;
  167.     fQueryGiven= NULL;
  168.     fInfo    = (char*)Nlm_MemGet(1, true); 
  169.     fInfoSize= 0; // fInfoSize is size of data not including terminating NULL !@!@$#@# 
  170. }
  171.  
  172. void DNetOb::Copy( DNetOb* anob)  
  173. {
  174.     if (anob) {
  175.     fProtocol= anob->fProtocol;      
  176.     fType     = anob->fType;                  
  177.     fName        = (char*) StrDup( (CharPtr)anob->fName);
  178.     fPath        = (char*) StrDup( (CharPtr)anob->fPath);
  179.     fHost        = (char*) StrDup( (CharPtr)anob->fHost);
  180.     fUser        = (char*) StrDup( (CharPtr)anob->fUser);
  181.     fPass        = (char*) StrDup( (CharPtr)anob->fPass);
  182.     fPort        = anob->fPort;      
  183.     fURL        = (char*) StrDup( (CharPtr)anob->fURL);
  184.     fIsLocal= anob->fIsLocal;
  185.     MemFree( fInfo); 
  186.     fInfoSize= anob->fInfoSize;
  187.     fInfo= (char*)MemDup( anob->fInfo, fInfoSize+1);
  188.     fQuery = anob->fQuery;             
  189.     fQueryGiven = StrDup( anob->fQueryGiven);         
  190.     }
  191. }
  192.  
  193. void DNetOb::DeleteInfo()
  194. {
  195.     if (fInfo) fInfo= (char*) MemMore( fInfo, 1);
  196.     else fInfo= (char*) MemNew(1);
  197.     *fInfo= 0;
  198.     fInfoSize= 0;
  199. }
  200.  
  201.  
  202.  
  203.  
  204. void DNetOb::StoreName(char* aStr)
  205. {
  206.     MemFree( fName);
  207.     fName= StrDup( aStr);
  208. }
  209.  
  210. void DNetOb::StorePath(char* aStr)
  211. {
  212.     MemFree( fPath);
  213.     fPath= StrDup( aStr);
  214. }
  215.  
  216. void DNetOb::StoreUser(char* aStr)
  217. {
  218.     MemFree( fUser);
  219.     fUser= StrDup( aStr);
  220. }
  221.  
  222. void DNetOb::StorePass(char* aStr)
  223. {
  224.     MemFree( fPass);
  225.     fPass= StrDup( aStr);
  226. }
  227.  
  228.  
  229. void DNetOb::StoreHost(char* aStr)
  230. {
  231.     if (!aStr || !*aStr || StrICmp(aStr,gEmptyString) == 0) 
  232.         aStr= (char*)kLocalhost;
  233.     MemFree( fHost);
  234.     fHost= StrDup( aStr);
  235.     fIsLocal= ( fHost==NULL 
  236.                             || StrICmp(fHost,kLocalhost) == 0  
  237.                             || StrICmp(fHost,gEmptyString) == 0 );
  238. }
  239.  
  240. void DNetOb::StorePort(char* aStr)
  241. {
  242.     short port= 0;
  243.     if (aStr) port= (short)atol(aStr); 
  244.     if (port) fPort= port;
  245. }
  246.  
  247.  
  248. // static
  249. short DNetOb::StandardPort( short protocol)
  250. {
  251.     switch (protocol) {
  252.         case kGopherprot: return kGopherport;
  253.         case kHTTPprot    : return kHTTPport;
  254.         case kSMTPprot    :    return kSMTPport;
  255.         case kBOPprot        :    return kBOPport;
  256.         case kFileprot    : return kFileport;
  257.         case kFTPprot        : return kFTPport;
  258.         case kTelnetprot: return kTelnetport;
  259.         case kTN3270prot: return kTN3270port;
  260.         case kWhoisprot    : return kWhoisport;
  261.         case kFingerprot: return kFingerport;
  262.         case kPOPprot        : return kPOPport;
  263.         case kNNTPprot    : return kNNTPport;
  264.         case kWAISprot    : return kWAISport;
  265.  
  266.         case kUnsupportedProt: return kUnsupportedPort;
  267.         default:
  268.         case kUnknownProt: return kUnknownPort;
  269.         }
  270. }
  271.  
  272. void DNetOb::StoreProtocol( short protocol)
  273. {
  274.     fProtocol= protocol;
  275.     fPort= StandardPort( fProtocol);
  276.     switch (fProtocol) {    
  277.             
  278.         case  kGopherprot    :  
  279.         case  kHTTPprot        :  
  280.         case  kFTPprot        : 
  281.         case  kBOPprot        : 
  282.         case  kFileprot        : 
  283.             // need to flag if localhost !? -- for all prots ??
  284.             fIsLocal= (StrICmp(GetHost(),kLocalhost) == 0 
  285.                             || StrICmp(GetHost(),gEmptyString) == 0 );
  286.             break;
  287.             
  288.             // currently unsupported
  289.         case  kNNTPprot        : 
  290.         case  kWAISprot        :  
  291.         case  kTelnetprot    :  
  292.         case  kTN3270prot    : 
  293.         case  kUnknownProt:
  294.         case  kUnsupportedProt:
  295.             fType= kTypeError; // ??
  296.             break;
  297.         }
  298. }
  299.  
  300.  
  301. const char* DNetOb::GetProtocol()
  302. {
  303. #if 0
  304.     short item= DNetOb::GetProtoItem(fProtocol);
  305.     if (item<0) return "unknown://";
  306.     return DNetOb::GetProtoName(item);
  307. #else
  308.     switch (fProtocol) {
  309.         case  kNNTPprot        : return "news:"; 
  310.         case  kSMTPprot        : return "mailto:"; 
  311.         case  kBOPprot        : return "bop://"; 
  312.         case  kGopherprot    : return "gopher://"; 
  313.         case  kHTTPprot        : return "http://"; 
  314.         case  kFTPprot        : return "ftp://";  // should be same as file:// ??
  315.         case  kFileprot        : return "file://"; 
  316.         case  kWAISprot        : return "wais://"; 
  317.         case  kTelnetprot    : return "telnet://"; 
  318.         case  kTN3270prot    : return "tn3270://"; 
  319.         
  320.         case  kUnknownProt: 
  321.         case  kUnsupportedProt: 
  322.         default: 
  323.                 return "unknown://";                
  324.         }
  325. #endif
  326. }
  327.  
  328. void DNetOb::StoreURL(char* aStr)
  329. {
  330.     MemFree(fURL); 
  331.     fURL= StrDup(aStr);
  332. }
  333.  
  334. const char* DNetOb::GetURL()
  335. {
  336. //    sprintf( buf, "URL: gopher://%s:%d/%c/%s%s", 
  337. //                    (char*) GetHost(), fPort, fType, (char*) GetPath(),LineEnd);
  338.     if (!fURL) {
  339.         char cstore[512];
  340.         char* url= StrDup( GetProtocol());
  341.         StrExtendCat( &url, (char*) GetHost());
  342.         if (fPort != StandardPort(fProtocol)) {
  343.             sprintf( cstore, ":%d", fPort);
  344.             StrExtendCat( &url, cstore);
  345.             }
  346.         
  347.         char* epath= DURL::EncodeChars( GetPath());
  348.         switch (fProtocol) {
  349.             case kGopherprot:
  350.                 sprintf( cstore, "/%c%s", fType,epath);
  351.                 StrExtendCat( &url, cstore);
  352.                 break;
  353.                 
  354.              case kFileprot:
  355.                 if (*epath != '/') {
  356.                     StrExtendCat( &url, "/");
  357.                     // ?? do some fiddling w/ *path ???
  358.                     }
  359.             default:
  360.                 StrExtendCat( &url, epath);
  361.                 break;
  362.             }
  363.             
  364.         MemFree( epath);
  365.         
  366.         if (fQueryGiven) {
  367.             StrExtendCat( &url, "?");
  368.             StrExtendCat( &url, fQueryGiven);
  369.             }
  370.             
  371.         fURL= url;
  372.         }
  373.     return fURL;
  374. }
  375.  
  376.  
  377.  
  378.  
  379.  
  380. Boolean DNetOb::Equals(DNetOb* other)
  381. {
  382.     if (!other) return false;
  383.     else if (fType != other->fType) return false;
  384.     else if (fPort != other->fPort) return false;
  385.     else if (fProtocol != other->fProtocol) return false;
  386.     else if (StringCmp( fHost, other->fHost)) return false;
  387.     else if (StringCmp( fPath, other->fPath)) return false;
  388.     else if (StringCmp( fQueryGiven, other->fQueryGiven)) return false;
  389.     else return true;
  390. }
  391.  
  392. Boolean DNetOb::operator ==(DNetOb* other)
  393. {
  394.     return Equals(other);
  395. }
  396.             
  397.  
  398.  
  399.  
  400. const char* DNetOb::GetKindName() 
  401.     return "Unknown"; 
  402. }
  403.  
  404. const char* DNetOb::GetName()   
  405. {
  406.     if (fName) return  fName;
  407.     else return gEmptyString;
  408. }
  409.  
  410. const char* DNetOb::GetPath()   
  411. {
  412.     if (fPath) return fPath;
  413.     else return gEmptyString;
  414. }
  415.  
  416. const char* DNetOb::GetHost()   
  417. {
  418.     if (fHost) return fHost;
  419.     else return gEmptyString;
  420. }
  421.  
  422. const char* DNetOb::GetUser()   
  423. {
  424.     if (fUser) return  fUser;
  425.     else return gEmptyString;
  426. }
  427.  
  428. const char* DNetOb::GetPass()   
  429. {
  430.     if (fPass) return  fPass;
  431.     else return gEmptyString;
  432. }
  433.  
  434. const char* DNetOb::GetPort()   
  435. {
  436.     static char sport[20];
  437.     if (fPort) {
  438.         sprintf(sport,"%d",fPort);
  439.         return sport;
  440.         }
  441.     else return gEmptyString;
  442. }
  443.  
  444.  
  445. const char* DNetOb::ShortName()   
  446. {
  447.     static char  shorty[33];
  448.     if (fName) {
  449.         strncpy(shorty, fName, 32);
  450.         shorty[33]= 0;
  451.         return shorty;
  452.         }
  453.     else return gEmptyString;
  454. }
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468. struct nobTypeRec {
  469.     char kind;
  470.     const char* name;
  471.     Boolean supported:1;
  472.     };
  473.  
  474.  
  475. Local nobTypeRec gProtoTypes[] = {
  476.     { DNetOb::kGopherprot, "gopher://", true },
  477.     { DNetOb::kHTTPprot, "http://", true },
  478.     { DNetOb::kFileprot, "file://", true },
  479.     { DNetOb::kFTPprot, "ftp://", true },
  480.     { DNetOb::kSMTPprot,"mailto:", true },
  481.     { DNetOb::kBOPprot,"bop://", true },
  482.     { DNetOb::kWAISprot, "wais://", false },
  483.     { DNetOb::kTelnetprot, "telnet://", false },
  484.     { DNetOb::kTN3270prot, "tn3270://", false },
  485.     { DNetOb::kNNTPprot, "news:", false },
  486.     { DNetOb::kFingerprot, "finger:", true },
  487.     { DNetOb::kWhoisprot, "whois:", true },
  488.     { DNetOb::kUnsupportedProt, "unsupported://", true },
  489.     { DNetOb::kUnknownProt, "unknown://", true },
  490.     {0,0}
  491.     };
  492.  
  493. //static
  494. const char* DNetOb::GetProtoName( short listitem)
  495. {
  496.     if (listitem>=0 && listitem < (sizeof(gProtoTypes) / sizeof(nobTypeRec)))
  497.         return gProtoTypes[listitem].name;
  498.     else
  499.         return NULL;
  500. }
  501.  
  502. char DNetOb::GetProtoVal( short listitem)
  503. {
  504.     if (listitem>=0 && listitem < (sizeof(gProtoTypes) / sizeof(nobTypeRec)))
  505.         return gProtoTypes[listitem].kind;
  506.     else
  507.         return 0;
  508. }
  509.  
  510. Boolean DNetOb::GetProtoSupport( short listitem)
  511. {
  512.     if (listitem>=0 && listitem < (sizeof(gProtoTypes) / sizeof(nobTypeRec)))
  513.         return gProtoTypes[listitem].supported;
  514.     else
  515.         return 0;
  516. }
  517.  
  518. short DNetOb::GetProtoItem( char theProto)
  519. {
  520.     short i;
  521.     for (i=0; i < ( sizeof(gProtoTypes) / sizeof(nobTypeRec)); i++) {
  522.         if (gProtoTypes[i].kind == theProto) return i;
  523.       }
  524.     return -1;
  525. }
  526.  
  527.  
  528.  
  529.  
  530.